package com.zjl.springmvc.interceptors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * spring是框架，mvc是一种设计模式。，
 * M代表model；V代表View；C代表controller
 * 从字面意思你也可以看出来
 *
 * M是指模型一般指DAO和service ；
 * view代表显示一般指页面eg：jsp，html ftl等
 * c值得是控制器，比如struts和springMVC 中的action与controller
 *     而springMVC严格意义上指的是前端控制器，
 *      就是每次客户端与服务器交互都要经过springMVC的controller。
 */
@Configuration
public class 设置拦截路径 implements WebMvcConfigurer {
    /**
     * 根据当前请求，找到HandlerExecutionChain
     * 【可以处理请求的handler以及handler的所有 拦截器】
     * 2、先来顺序执行 所有拦截器的 preHandle方法
     * ● 1、如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle
     * ● 2、如果当前拦截器返回为false。直接
     *          倒序执行所有已经执行了的拦截器的  afterCompletion；
     * 3、如果任何一个拦截器返回false。直接跳出不执行目标方法
     *          _____________________________________________________________________
     * 页面渲染  | preHandle-》      | preHandle-》        | preHandle-》    |
     *     |    |                   |                    |                 |     ---->目标方法
     *      |    | 拦截器1            |  拦截器2            |  拦截器2         |            |
     *      |    |                  |                    |                 |           |
     *      |    |postHandle《——    |postHandle《——       |postHandle《——   |    <-----|
     *      |   |                   |                     |                |
     *      |   |                   |                    |                 |
     *      |   |afterCompletion《——|afterCompletion 《——|afterCompletion<-<  |
     *      |   |____________________|__________________|________________ |_____________
     *      |———————————————————————————————————————————————————————————— |——
     */

    @Autowired
    MyInterceptor myInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/interceptor")//需要拦截哪些 /**是所有请求都拦截  包括静态
                .excludePathPatterns("/","/login","/css/**",
                        "/js/**","/fonts/**","/images/**");//需要放行哪些
    }//配置拦截器
}
